home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / DSHJ2 / BIGROT2.S < prev    next >
Encoding:
Text File  |  2001-02-10  |  9.6 KB  |  539 lines

  1. *********************************************
  2. *
  3. *
  4. *
  5. *   Rotate 90 degrees clockwise a large rectangular page-size form in place
  6. *   where the DST form width is less than the SRC form
  7. *
  8. *   Programmer: Dave Staugas
  9. *         Date: 7-June-89
  10. *
  11. *
  12. *
  13.     .globl    roto
  14.     .globl    recrot
  15. *
  16. *
  17. *   Entry:
  18. *
  19. *   a0   -> base address of landscape form to rotate
  20. *   a1   -> buffer large enough for 16 * (DST form-width) bytes
  21. *   d0.w =  SRC form-width in bytes (must be even)
  22. *   d1.w =  DST form-width in bytes (must be even)
  23. *
  24. *   Exit:
  25. *
  26. *   all registers preserved, rectangular form is rotated in place
  27. *        90 degrees clockwise with new (DST) form-width
  28. *
  29. recrot:
  30.     movem.l    a0-a6/d0-d7,-(sp)
  31. *
  32. *  1st rotate largest chunk (a square) in place
  33. *
  34.     move.w    d1,d4        ;do a square rotate 1st
  35.     bsr    roto        ;rotate the biggest chunk in place
  36. *
  37. *  Now rotate-copy a vertical column of tiles to temp buffer
  38. *
  39.     move.l    a1,a5        ;save temp buf ptr in a5
  40.     lea    (a0,d1.w),a2    ;a2-> SRC top tile of column just rite of square
  41.     lea    -2(a1,d1.w),a3    ;a3-> DST rightmost tile of temp buf
  42. schlp:
  43.     move.w    d0,d7        ;d0 = SRC wrap
  44.     lsl.w    #4,d7        ;d7 = tile wrap
  45. *
  46.     move.l    a2,a4        ;save a2 for later
  47.     move.w    d1,d4        ;DST width
  48.     lsr.w    #1,d4
  49.     subq.w    #1,d4        ;d4 = # of tiles in column (-1)
  50. buflp:
  51.     move.l    a2,a1
  52.     move.l    a3,a6
  53.     bsr    rot2tile
  54.     adda.w    d7,a2
  55.     subq.l    #2,a3    
  56.     dbra    d4,buflp
  57. *
  58. *   buffer is full, now scrunch the big form (decrease SRC width by 2 bytes)
  59. *
  60.     move.l    a4,a3        ;1st DST to holding buffer
  61.     lea    2(a3),a2    ;1st SRC column just right of big square
  62.     move.w    d1,d4
  63.     lsl.w    #3,d4        ;DST width *8 is # of rows
  64.     move.w    d4,d7
  65.     subq.w    #2,d7
  66. *
  67.     subq.w    #2,d0        ;new SRC width (it's shrinking)
  68.     move.w    d0,d4
  69.     lsr.w    #2,d4        ;get # of long words in SRC row
  70.     bcc.s    elong        ;br if integral # of longwords
  71. *
  72. *   else, do one short word 1st..
  73. *
  74. rwlp0:
  75.     move.w    d4,d5
  76.     move.w    (a2)+,(a3)+
  77.     bra.s    rwlp1i
  78. rwlp1:
  79.     move.l    (a2)+,(a3)+
  80. rwlp1i:
  81.     dbra    d5,rwlp1
  82.     addq.l    #2,a2
  83.     dbra    d7,rwlp0
  84.     bra.s    rwdone
  85. elong:    
  86.     move.w    d4,d5
  87.     bra.s    rwlp2i
  88. rwlp2:
  89.     move.l    (a2)+,(a3)+
  90. rwlp2i:
  91.     dbra    d5,rwlp2
  92.     addq.l    #2,a2
  93.     dbra    d7,elong
  94. rwdone:
  95.     move.w    d0,d7
  96.     sub.w    d1,d7
  97.     lsr.w    #1,d7
  98.     bra    rwlp5i            ;gotta get special case
  99. rwlp5:
  100.     move.w    (a2)+,(a3)+        ;copied for inner column difference
  101. rwlp5i:
  102.     dbra    d7,rwlp5
  103. *
  104. *
  105. *
  106. scrnchlp:
  107.     lea    -2(a0,d0.w),a2    ;a2-> SRC top tile column at far right 
  108.     lea    -2(a3,d1.w),a3    ;a3-> DST rightmost tile of space just freed
  109. *
  110.     move.w    d0,d7        ;d0 = SRC wrap
  111.     lsl.w    #4,d7        ;d7 = tile wrap
  112. *
  113.     move.l    a2,a4        ;save a2 for later
  114.     move.w    d1,d4        ;DST width
  115.     lsr.w    #1,d4
  116.     subq.w    #1,d4        ;d4 = # of tiles in column (-1)
  117. bufloop:
  118.     move.l    a2,a1
  119.     move.l    a3,a6
  120.     bsr    rot2tile
  121.     adda.w    d7,a2
  122.     subq.l    #2,a3    
  123.     dbra    d4,bufloop
  124. *
  125. *   buffer is full, now scrunch the big form (decrease SRC width by 2 bytes)
  126. *
  127.     move.l    a4,a3        ;1st DST to holding buffer
  128.     lea    2(a3),a2    ;1st SRC column just right of big square
  129.     move.w    d1,d4
  130.     lsl.w    #3,d4        ;DST width *8 is # of rows
  131.     move.w    d4,d7
  132.     subq.w    #2,d7
  133. *
  134.     subq.w    #2,d0        ;new SRC width (it's shrinking)
  135.     move.w    d0,d4
  136.     lsr.w    #2,d4        ;get # of long words in SRC row
  137.     bcc.s    evnlong        ;br if integral # of longwords
  138. *
  139. *   else, do one short word 1st..
  140. *
  141. rowlp0:
  142.     move.w    d4,d5
  143.     move.w    (a2)+,(a3)+
  144.     bra.s    rowlp1i
  145. rowlp1:
  146.     move.l    (a2)+,(a3)+
  147. rowlp1i:
  148.     dbra    d5,rowlp1
  149.     addq.l    #2,a2
  150.     dbra    d7,rowlp0
  151.     bra.s    rowdone
  152. evnlong:    
  153.     move.w    d4,d5
  154.     bra.s    rowlp2i
  155. rowlp2:
  156.     move.l    (a2)+,(a3)+
  157. rowlp2i:
  158.     dbra    d5,rowlp2
  159.     addq.l    #2,a2
  160.     dbra    d7,evnlong
  161. rowdone:
  162.     cmp.w    d0,d1            ;have we become DST form-width?
  163.     bne    scrnchlp        ;iterate until we are DST
  164. *
  165. *   Now copy buffer to last freed area
  166. *
  167. *    a3-> DST tile area just freed
  168. *
  169.     move.l    a5,a2        ;get buffer copied back in
  170. *
  171.     lsl.w    #3,d0        ;DST wrap *8 is # of words in buffer
  172.     bra.s    bufini
  173. bufinlp:
  174.     move.w    (a2)+,(a3)+
  175. bufini:
  176.     dbra    d0,bufinlp
  177. *
  178.     movem.l    (sp)+,a0-a6/d0-d7
  179.     rts
  180. *
  181. *   Rotate 90 degrees clockwise a large square page-size form in place
  182. *
  183. *   Programmer: Dave Staugas
  184. *         Date: 5-June-89
  185. *
  186. *   Entry:
  187. *
  188. *   a0   -> base address of square form to rotate
  189. *   d0.w =  form-width in bytes (must be even)
  190. *   d4.w =  # of bytes on a side of the square (also must be even)
  191. *
  192. *   Exit:
  193. *
  194. *  all regs preserved, square form is rotated in place 90 degrees clockwise
  195. *
  196. roto:
  197.     movem.l    a0-a6/d0-d7,-(sp)
  198.     move.w    d0,d7        ;copy form-width to d7
  199.     lsl.w    #4,d7        ;x16 for offset in form for 1 tile down
  200. *
  201.     lsr.w    #1,d4        ;d4 = # tiles on a side
  202. *
  203. *   a2 -> top/left tile address
  204. *
  205. *   d0 = form-wrap
  206. *   d4 = # of tiles on a side
  207. *   d7 = offset in form for 1 tile down
  208. *
  209. rotlp0:
  210.     move.l    a0,a2        ;a2 -> top/left tile
  211.     move.w    d4,d3
  212.     subq.w    #1,d3
  213.     mulu    d7,d3
  214.     lea    (a2,d3.l),a4    ;a4 -> bot/left tile
  215.     add.w    d4,d4
  216.     lea    -2(a2,d4.w),a3    ;a3 -> top/right tile
  217.     lea    -2(a4,d4.w),a5    ;a5 -> bot/right tile
  218.     lsr.w    #1,d4
  219. rotlp1:
  220.     move.l    a2,a1        ;top/left is SRC
  221.     moveq    #2,d1        ;DST form wrap (just 16 byte buffer)
  222.     lea    tilebuf,a6
  223.     bsr    rot2tile    ;rotate top/left to buffer
  224. *
  225.     move.l    a4,a1        ;bot/left is SRC
  226.     move.w    d0,d1        ;DST form wrap is same as SRC
  227.     move.l    a2,a6        ;top/left is DST
  228.     bsr    rot2tile    ;rotate bot/left to top/left tile
  229. *    
  230.     move.l    a5,a1        ;bot/right is SRC
  231.     move.l    a4,a6        ;bot/left is DST
  232.     bsr    rot2tile    ;rotate bot/right to bot/left tile
  233. *
  234.     move.l    a3,a1        ;top/right is SRC
  235.     move.l    a5,a6        ;bot/right is DST
  236.     bsr    rot2tile    ;rotate top/right to bot/right
  237. *
  238.     lea    tilebuf,a1
  239.     move.l    a3,a6
  240.     moveq    #15,d5
  241. coploop:
  242.     move.w    (a1)+,(a6)
  243.     adda.w    d0,a6
  244.     dbra    d5,coploop    ;copy rotated tile buffer to top/left
  245. *
  246.     adda.w    d7,a2        ;move top/left down 1 tile
  247.     suba.w    d7,a5        ;move bot/right up 1 tile
  248.     addq.l    #2,a4        ;move bot/left right 1 tile
  249.     subq.l    #2,a3        ;move top/right left 1 tile
  250.     cmp.l    a0,a3        ;does top/right equal base?
  251.     bne    rotlp1        ;iterate until it does
  252. *
  253.     lea    2(a0,d7.w),a0    ;now put base down 1 tile & left 1 tile
  254.     subq.l    #2,d4        ;next # of tiles on a side
  255.     beq.s    rotdone        ;br if none left
  256.     cmpi.w    #1,d4        ;check for odd case
  257.     bne    rotlp0
  258. *
  259.     move.l    a0,a1
  260.     move.l    a0,a6
  261.     bsr    rot2tile
  262. *
  263. rotdone:
  264.     movem.l    (sp)+,a0-a6/d0-d7
  265.     rts
  266. *
  267. *
  268. *
  269. *
  270. *    
  271. ******************************************
  272. *
  273. *   Rotate a 16x16 pixel tile clockwise 90 degrees and copy to another tile
  274. *
  275. *
  276. *   d0 = SRC form-wrap
  277. *   d1 = DST form-wrap
  278. *
  279. *   a1 -> top/left of SRC tile
  280. *   a6 -> top/left of DST tile
  281. *  
  282. rot2tile:
  283.     movem.l    a0/a2-a5/d0-d1/d4/d7,-(sp)
  284. *
  285. *  pack 16 words of tile into 4 data & 4 address registers..
  286. *
  287.     move.w    (a1),d2
  288.     adda.w    d0,a1
  289.     move.w    (a1),d3
  290.     adda.w    d0,a1
  291.     move.w    (a1),d4
  292.     adda.w    d0,a1
  293.     move.w    (a1),d5
  294.     adda.w    d0,a1
  295. *
  296.     swap    d2
  297.     swap    d3
  298.     swap    d4
  299.     swap    d5
  300. *
  301.     move.w    (a1),d2
  302.     adda.w    d0,a1
  303.     move.w    (a1),d3
  304.     adda.w    d0,a1
  305.     move.w    (a1),d4
  306.     adda.w    d0,a1
  307.     move.w    (a1),d5
  308.     adda.w    d0,a1
  309. *
  310.     exg    d2,a2
  311.     exg    d3,a3
  312.     exg    d4,a4
  313.     exg    d5,a5
  314. *
  315.     move.w    (a1),d2
  316.     adda.w    d0,a1
  317.     move.w    (a1),d3
  318.     adda.w    d0,a1
  319.     move.w    (a1),d4
  320.     adda.w    d0,a1
  321.     move.w    (a1),d5
  322.     adda.w    d0,a1
  323. *
  324.     swap    d2
  325.     swap    d3
  326.     swap    d4
  327.     swap    d5
  328. *
  329.     move.w    (a1),d2
  330.     adda.w    d0,a1
  331.     move.w    (a1),d3
  332.     adda.w    d0,a1
  333.     move.w    (a1),d4
  334.     adda.w    d0,a1
  335.     move.w    (a1),d5
  336. *
  337. *   Got all 16 words of tile in registers, now rotate..
  338. *
  339.     moveq    #3,d0        ;iterate 4 times
  340. rotlp2:
  341.     swap    d1        ;DST form-width to high word
  342.     swap    d0        ;get d0.w ready to receive bits
  343.     add.w    d5,d5
  344.     addx.w    d1,d1
  345.     add.w    d5,d5
  346.     addx.w    d0,d0
  347.     add.w    d5,d5
  348.     addx.w    d6,d6
  349.     add.w    d5,d5
  350.     addx.w    d7,d7
  351.  
  352.     add.w    d4,d4
  353.     addx.w    d1,d1
  354.     add.w    d4,d4
  355.     addx.w    d0,d0
  356.     add.w    d4,d4
  357.     addx.w    d6,d6
  358.     add.w    d4,d4
  359.     addx.w    d7,d7
  360.  
  361.     add.w    d3,d3
  362.     addx.w    d1,d1
  363.     add.w    d3,d3
  364.     addx.w    d0,d0
  365.     add.w    d3,d3
  366.     addx.w    d6,d6
  367.     add.w    d3,d3
  368.     addx.w    d7,d7
  369.  
  370.     add.w    d2,d2
  371.     addx.w    d1,d1
  372.     add.w    d2,d2
  373.     addx.w    d0,d0
  374.     add.w    d2,d2
  375.     addx.w    d6,d6
  376.     add.w    d2,d2
  377.     addx.w    d7,d7
  378. *
  379.     swap    d2
  380.     swap    d3
  381.     swap    d4
  382.     swap    d5
  383. *
  384.     add.w    d5,d5
  385.     addx.w    d1,d1
  386.     add.w    d5,d5
  387.     addx.w    d0,d0
  388.     add.w    d5,d5
  389.     addx.w    d6,d6
  390.     add.w    d5,d5
  391.     addx.w    d7,d7
  392.  
  393.     add.w    d4,d4
  394.     addx.w    d1,d1
  395.     add.w    d4,d4
  396.     addx.w    d0,d0
  397.     add.w    d4,d4
  398.     addx.w    d6,d6
  399.     add.w    d4,d4
  400.     addx.w    d7,d7
  401.  
  402.     add.w    d3,d3
  403.     addx.w    d1,d1
  404.     add.w    d3,d3
  405.     addx.w    d0,d0
  406.     add.w    d3,d3
  407.     addx.w    d6,d6
  408.     add.w    d3,d3
  409.     addx.w    d7,d7
  410.  
  411.     add.w    d2,d2
  412.     addx.w    d1,d1
  413.     add.w    d2,d2
  414.     addx.w    d0,d0
  415.     add.w    d2,d2
  416.     addx.w    d6,d6
  417.     add.w    d2,d2
  418.     addx.w    d7,d7
  419. *
  420.     swap    d2
  421.     swap    d3
  422.     swap    d4
  423.     swap    d5
  424. *
  425.     exg    d2,a2
  426.     exg    d3,a3
  427.     exg    d4,a4
  428.     exg    d5,a5
  429. *
  430. *
  431.     add.w    d5,d5
  432.     addx.w    d1,d1
  433.     add.w    d5,d5
  434.     addx.w    d0,d0
  435.     add.w    d5,d5
  436.     addx.w    d6,d6
  437.     add.w    d5,d5
  438.     addx.w    d7,d7
  439.  
  440.     add.w    d4,d4
  441.     addx.w    d1,d1
  442.     add.w    d4,d4
  443.     addx.w    d0,d0
  444.     add.w    d4,d4
  445.     addx.w    d6,d6
  446.     add.w    d4,d4
  447.     addx.w    d7,d7
  448.  
  449.     add.w    d3,d3
  450.     addx.w    d1,d1
  451.     add.w    d3,d3
  452.     addx.w    d0,d0
  453.     add.w    d3,d3
  454.     addx.w    d6,d6
  455.     add.w    d3,d3
  456.     addx.w    d7,d7
  457.  
  458.     add.w    d2,d2
  459.     addx.w    d1,d1
  460.     add.w    d2,d2
  461.     addx.w    d0,d0
  462.     add.w    d2,d2
  463.     addx.w    d6,d6
  464.     add.w    d2,d2
  465.     addx.w    d7,d7
  466. *
  467. *
  468.     swap    d2
  469.     swap    d3
  470.     swap    d4
  471.     swap    d5
  472. *
  473.  
  474.     add.w    d5,d5
  475.     addx.w    d1,d1
  476.     add.w    d5,d5
  477.     addx.w    d0,d0
  478.     add.w    d5,d5
  479.     addx.w    d6,d6
  480.     add.w    d5,d5
  481.     addx.w    d7,d7
  482.  
  483.     add.w    d4,d4
  484.     addx.w    d1,d1
  485.     add.w    d4,d4
  486.     addx.w    d0,d0
  487.     add.w    d4,d4
  488.     addx.w    d6,d6
  489.     add.w    d4,d4
  490.     addx.w    d7,d7
  491.  
  492.     add.w    d3,d3
  493.     addx.w    d1,d1
  494.     add.w    d3,d3
  495.     addx.w    d0,d0
  496.     add.w    d3,d3
  497.     addx.w    d6,d6
  498.     add.w    d3,d3
  499.     addx.w    d7,d7
  500.  
  501.     add.w    d2,d2
  502.     addx.w    d1,d1
  503.     add.w    d2,d2
  504.     addx.w    d0,d0
  505.     add.w    d2,d2
  506.     addx.w    d6,d6
  507.     add.w    d2,d2
  508.     addx.w    d7,d7
  509. *
  510.     swap    d2
  511.     swap    d3
  512.     swap    d4
  513.     swap    d5
  514. *
  515.     exg    d2,a2
  516.     exg    d3,a3
  517.     exg    d4,a4
  518.     exg    d5,a5
  519. *
  520.     move.w    d1,(a6)
  521.     swap    d1        ;get DST form-width
  522.     adda.w    d1,a6
  523.     move.w    d0,(a6)
  524.     swap    d0        ;get loop count
  525.     adda.w    d1,a6
  526.     move.w    d6,(a6)
  527.     adda.w    d1,a6
  528.     move.w    d7,(a6)
  529.     adda.w    d1,a6
  530. *
  531.     dbra    d0,rotlp2    ;do all 16
  532. *
  533.     movem.l    (sp)+,a0/a2-a5/d0-d1/d4/d7
  534.     rts
  535. *
  536.     .bss
  537. tilebuf:
  538.     .ds.w    16
  539.